package br.unifor.ads.desphouse.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import br.unifor.ads.desphouse.entity.Lancamento;
import br.unifor.ads.desphouse.entity.Parcelamento;

/**
 * 
 * @author Arley
 */
public class ParcelamentoDAO {
	
	private EntityManager em = new EntityManager() {
		@Override
		public Object trataResultSet(ResultSet resultSet) throws SQLException {
			Parcelamento parcelamento = new Parcelamento();
			parcelamento.setCodigo(resultSet.getLong("codigo"));
			parcelamento.setNumero(resultSet.getLong("numero"));
			parcelamento.setDataVencimento(resultSet.getDate("data_vencimento"));
			parcelamento.setValor(resultSet.getFloat("valor"));
			parcelamento.setPago(resultSet.getBoolean("pago"));
			//Parcelamento
			Lancamento lancamento = new Lancamento();
			lancamento.setCodigo(resultSet.getLong("lancamento_codigo"));
			parcelamento.setLancamento(lancamento);
			return parcelamento;
		}
	};
	
	public Parcelamento salvar(Parcelamento parcelamento) throws SQLException {
		String sql = 
				"insert into financeiro.parcelamento "
				+ "(numero,data_vencimento,valor,pago,lancamento_codigo) "
				+ "values "
				+ "(?, ?, ?, ?, ?) "
				+ "returning codigo,numero,data_vencimento,valor,pago,lancamento_codigo";
		return (Parcelamento) em.getSingleResult(sql, 
				parcelamento.getNumero(), new java.sql.Date(parcelamento.getDataVencimento().getTime()),
				parcelamento.getValor(), parcelamento.getPago(), 
				parcelamento.getLancamento().getCodigo());
	}
	
	

	public void atualizar(Parcelamento parcelamento) throws SQLException {
		  String sql = "update financeiro.parcelamento set "
		    + "numero = ?, data_vencimento = ?, valor = ?, pago = ?, lancamento_codigo = ? "
		    + "where codigo = ?";
		  em.executeQuery(sql, 
		    parcelamento.getNumero(),parcelamento.getDataVencimento(),
		    parcelamento.getValor(), parcelamento.getPago(),
		    parcelamento.getLancamento().getCodigo(), 
		    parcelamento.getCodigo());
		 }

	public void excluirPorCodigo(Long codigo) throws SQLException {
		String sql = "delete from financeiro.parcelamento where codigo = ?";
		em.executeQuery(sql, codigo);
	}

	public void excluirTodos() throws SQLException {
		String sql = "delete from financeiro.parcelamento";
		em.executeQuery(sql);
	}

	public Parcelamento buscarPorCodigo(Long codigo) throws SQLException {
		String sql = "select codigo, numero, data_vencimento, valor, pago, lancamento_codigo"
				+ " from financeiro.parcelamento where codigo = ?";
		return (Parcelamento) em.getSingleResult(sql, codigo);
	}

	@SuppressWarnings("unchecked")
	public List<Parcelamento> buscarTodos() throws SQLException {
		String sql = "select "
				+ "codigo, numero, data_vencimento, valor, pago, lancamento_codigo "
				+ "from financeiro.parcelamento";
		return (List<Parcelamento>) em.getResultList(sql);
	}
	
	@SuppressWarnings("unchecked")
	/**
	 * Retorna todas as parcelas de um determinado lancamento
	 * 
	 * @param codigoLancamento
	 * @return
	 * @throws SQLException
	 */
	public List<Parcelamento> buscarParcelaPorLancamento(Long codigoLancamento) throws SQLException {
		String sql = "select "
				+ "codigo, numero, data_vencimento, valor, pago, lancamento_codigo "
				+ "from financeiro.parcelamento "
				+ "where lancamento_codigo = ?";
		return (List<Parcelamento>) em.getResultList(sql, codigoLancamento);
	}
	
	/**
	 * Remove todas as parcelas de um lancamento
	 * 
	 * @throws SQLException
	 */
	public void excluirParcelasLancamento(Long codigoLancamento) throws SQLException {
		String sql = "delete from financeiro.parcelamento where codigo = ?";
		em.executeQuery(sql, codigoLancamento);
	}

}
